package cn.wolfcode.util;

import java.time.*;
import java.time.temporal.ChronoUnit;
import java.util.Calendar;
import java.util.Date;


public class DateUtil {


    /**
     * 根据日期和场次看是否在秒杀有效时间之内
     *
     * @param startDate
     * @param time
     * @return
     */
    public static boolean isLegalTime(Date startDate, int time) {
        Calendar c = Calendar.getInstance();
        c.setTime(startDate);
        c.set(Calendar.HOUR_OF_DAY, time);
        // 开始的时间戳
        long start = c.getTime().getTime();

        // 当前时间戳
        long now = new Date().getTime();

        // 为开始时间 + 2小时
        c.add(Calendar.HOUR_OF_DAY, 2);

        // 获取到开始时间两小时后的时间戳 == 结束时间
        long end = c.getTime().getTime();
        // 判断如果当前时间 >= 开始时间 && <= 结束时间
        return now >= start && now < end;
    }

    /**
     * 非jdk8的方式
     * @param startDate 秒杀开始日期
     * @param time      秒杀开始时间
     * @return
     */
    public static Boolean betweenSeckillDateTime(Date startDate, Integer time) {
        Calendar instance = Calendar.getInstance();
        instance.setTime(startDate);
        instance.set(Calendar.HOUR_OF_DAY,time);
        long startTime = instance.getTime().getTime();
        instance.add(Calendar.HOUR_OF_DAY,8);
        long endTime = instance.getTime().getTime();
        long currentTime = System.currentTimeMillis();
        return startTime <= currentTime && currentTime < endTime;
    }

    /**
     * jdk8的方式判断某个时间是否在两个时间之前
     * @param startDate 秒杀开始日期
     * @param time      秒杀开始时间
     * @return
     */
    public static Boolean betweenSeckillDateTimeForJDK8(Date startDate, Integer time) {
        LocalDateTime startTime = LocalDateTime.ofInstant(startDate.toInstant(), ZoneId.systemDefault()).withHour(time);
        LocalDateTime endTime = startTime.plusHours(2);
        LocalDateTime now = LocalDateTime.now();
        return now.isAfter(startTime) && now.isBefore(endTime);
    }

    /**
     * 判断当前日期是否在某个日期之间
     * @param startDate
     * @param day
     * @return
     */
    public static Boolean betweenDate(String startDate, long day) {
        long startDateLong = Long.parseLong(startDate);
        Instant startInstant = Instant.ofEpochMilli(startDateLong);
        LocalDate startLocalDate = startInstant.atZone(ZoneId.systemDefault()).toLocalDate();
        LocalDate nowLocalDate = LocalDate.now(ZoneId.systemDefault());
        long days = ChronoUnit.DAYS.between(startLocalDate, nowLocalDate);
        return days <= day;
    }

    /**
     * 在 JDK 8 中，Java 提供了一组新的日期和时间 API，位于 java.time 包中，用于处理日期和时间。这些类提供了更加简单、灵活和易于使用的方式来处理日期和时间。
     *
     * 以下是 JDK 8 中与日期和时间相关的主要类：
     *
     * 1. LocalDate：表示一个日期，不包含时间和时区信息。
     * 2. LocalTime：表示一个时间，不包含日期和时区信息。
     * 3. LocalDateTime：表示日期和时间，不包含时区信息。
     * 4. ZonedDateTime：表示带有时区的日期和时间。
     * 5. Instant：表示时间线上的一个特定点，通常用于机器时间。
     * 6. Period：表示日期之间的时间间隔，以年、月、日为单位。
     * 7. Duration：表示时间之间的持续时间，以秒和纳秒为单位。
     * 8. DateTimeFormatter：用于格式化和解析日期和时间的工具类。
     */
}
